package domein;

import java.util.Calendar;
import java.util.GregorianCalendar;

import util.Datum;

public class Huurovereenkomst 
{
/*Attributen*/
	private int huurovereenkomstId;
	private Klant deKlant;
	private Auto deAuto;
	private Medewerker deMedewerker;
	private Datum beginDatum;
	private Datum eindDatum;
	private Datum opmaakDatum;
	private int keuzeExtraVerzekering;
	private boolean wijzeBetaling;
	private double bedragVoorschot;
	
/*Constructors*/
	public Huurovereenkomst(Medewerker deMedewerker)
	{
		this.setDeMedewerker(deMedewerker);
		this.setOpmaakDatum(new Datum());
	}
	public Huurovereenkomst(Klant deKlant,Auto deAuto,Medewerker deMedewerker,Datum beginDatum,Datum eindDatum,Datum opmaakDatum,int extraVerzekering,boolean wijzeBetaling,double bedragVoorschot)
	{
		this.setDeKlant(deKlant);
		this.setDeAuto(deAuto);
		this.setDeMedewerker(deMedewerker);
		this.setBeginDatum(beginDatum);
		this.setEindDatum(eindDatum);
		this.setOpmaakDatum(opmaakDatum);
		this.setKeuzeExtraVerzekering(extraVerzekering);
		this.setWijzeBetaling(wijzeBetaling);
		this.setBedragVoorschot(bedragVoorschot);
	}
	public Huurovereenkomst(int huurovereenkomstId,Klant deKlant,Auto deAuto,Medewerker deMedewerker,Datum beginDatum,Datum eindDatum,Datum opmaakDatum,int extraVerzekering,boolean wijzeBetaling,double bedragVoorschot)
	{
		this(deKlant,deAuto,deMedewerker,beginDatum,eindDatum,opmaakDatum,extraVerzekering,wijzeBetaling,bedragVoorschot);
		this.setHuurovereenkomstId(huurovereenkomstId);
	}
	
/*Methodes*/
	public String toString()
	{
		return ("" + this.deKlant.getKlantAchternaam() + " - " + this.deAuto.getAutoMerk());
		
	}
	public double berekenHuurbedrag()
	{
		double bedrag=0;
		double dagprijs=deAuto.getDagprijs();
		
		int aantalDagen=berekenAantalDagen();
		int aantalDagenWeekend=berekenAantalWeekendDagen();
		final double VERHOGING_WEEKEND=1.20;
		
		if(aantalDagen>=3)
			bedrag = dagprijs*aantalDagen;
		else
			bedrag = (dagprijs*(aantalDagen-aantalDagenWeekend))
					+ (dagprijs*VERHOGING_WEEKEND*aantalDagenWeekend);
		return bedrag;
	}
	public double berekenExtraVerzekering()
	{
		double bedrag=0;
		if (keuzeExtraVerzekering==1)//Beperkte omnium/dag
		{
			switch(deAuto.getWaarborgcode())
			{
				case 'A':bedrag = 10.00;
					break;
				case 'B':bedrag = 15.00;
					break;
				case 'C':bedrag = 20.00;
					break;
				case 'D':bedrag = 25.00;
					break;
				case 'E':bedrag = 35.00;
					break;
				case 'F':bedrag = 40.00;
					break;
				case 'G':bedrag = 45.00;
					break;
				case 'H':bedrag = 45.00;
					break;
				case 'I':bedrag = 50.00;
					break;
			}
		}
		else if(keuzeExtraVerzekering==2) //Volledige omnium/dag
		{
			switch(deAuto.getWaarborgcode())
			{
				case 'A':bedrag = 25.00;
					break;
				case 'B':bedrag = 40.00;
					break;
				case 'C':bedrag = 55.00;
					break;
				case 'D':bedrag = 60.00;
					break;
				case 'E':bedrag = 70.00;
					break;
				case 'F':bedrag = 80.00;
					break;
				case 'G':bedrag = 90.00;
					break;
				case 'H':bedrag = 95.00;
					break;
				case 'I':bedrag = 100.00;
					break;
			}
		}
		else
		{
			bedrag=0;
		}
		return bedrag * berekenAantalDagen();
	}
	public double berekenWaarborg()
	{
		double bedrag=0;
		switch(deAuto.getWaarborgcode())
			{
				case 'A':bedrag = 1000.00;
					break;
				case 'B':bedrag = 1250.00;
					break;
				case 'C':bedrag = 1500.00;
					break;
				case 'D':bedrag = 1750.00;
					break;
				case 'E':bedrag = 2000.00;
					break;
				case 'F':bedrag = 2250.00;
					break;
				case 'G':bedrag = 2500.00;
					break;
				case 'H':bedrag = 2750.00;
					break;
				case 'I':bedrag = 3000.00;
					break;
			}
		if(berekenAantalDagen()>=3)
		{
			if(keuzeExtraVerzekering==1)
				bedrag=bedrag*0.70;
			else if(keuzeExtraVerzekering==2)
				bedrag=bedrag*0.50;
		}
		return bedrag;
	}
	public double berekenMinimaalVoorschot()
	{
		return (berekenTotaalbedrag()/4);
	}
	public GregorianCalendar berekenBetaaldatum()
	{
		int i=1;
		//if(beginDatum.get(Calendar.DAY_OF_MONTH) == Calendar.SATURDAY)
			//i=1;
		if(beginDatum.get(Calendar.DAY_OF_MONTH) == Calendar.SUNDAY)
			i=2;
		else if(beginDatum.get(Calendar.DAY_OF_MONTH) == Calendar.MONDAY)
			i=3;
		GregorianCalendar tempDatum=beginDatum;
		tempDatum.setTimeInMillis(beginDatum.getTimeInMillis()-(i*(24*60*60*1000)));
		return tempDatum;
	}
	
	public double berekenTotaalbedrag()
	{
		return this.berekenHuurbedrag()+ this.berekenExtraVerzekering();
	}
	public int berekenAantalDagen()
	{
		return beginDatum.datumVerschil(eindDatum);
	}
	public int berekenAantalWeekendDagen()
	{
		int aantalDagen=berekenAantalDagen();
		if(aantalDagen<=3)
		{
			if(beginDatum.get(Calendar.DAY_OF_WEEK)==Calendar.FRIDAY)
				aantalDagen--;
			else if(beginDatum.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY && aantalDagen>1)
				aantalDagen--;
		}
		else
			aantalDagen=0;
		return aantalDagen;
	}
	
/*Getters & setters*/
	public Auto getDeAuto()
	{
		return deAuto;
	}
	public void setDeAuto(Auto deAuto)
	{
		this.deAuto = deAuto;
	}
	public Klant getDeKlant()
	{
		return deKlant;
	}
	public void setDeKlant(Klant deKlant)
	{
		this.deKlant = deKlant;
	}
	public Datum getBeginDatum()
	{
		return beginDatum;
	}
	public void setBeginDatum(Datum beginDatum)
	{
		this.beginDatum = beginDatum;
	}
	public Datum getEindDatum()
	{
		return eindDatum;
	}
	public void setEindDatum(Datum eindDatum)
	{
		this.eindDatum = eindDatum;
	}
	public int getKeuzeExtraVerzekering()
	{
		return keuzeExtraVerzekering;
	}
	public void setKeuzeExtraVerzekering(int keuzeExtraVerzekering)
	{
		this.keuzeExtraVerzekering = keuzeExtraVerzekering;
	}
	public boolean isWijzeBetaling()
	{
		return wijzeBetaling;
	}
	public void setWijzeBetaling(boolean wijzeBetaling)
	{
		this.wijzeBetaling = wijzeBetaling;
	}
	public double getBedragVoorschot()
	{
		return bedragVoorschot;
	}
	public void setBedragVoorschot(double bedragVoorschot)
	{
		this.bedragVoorschot = bedragVoorschot;
	}
	public Medewerker getDeMedewerker()
	{
		return deMedewerker;
	}
	public void setDeMedewerker(Medewerker deMedewerker)
	{
		this.deMedewerker = deMedewerker;
	}
	public Datum getOpmaakDatum()
	{
		return opmaakDatum;
	}
	public void setOpmaakDatum(Datum opmaakDatum)
	{
		this.opmaakDatum = opmaakDatum;
	}

	public int getHuurovereenkomstId()
	{
		return huurovereenkomstId;
	}

	public void setHuurovereenkomstId(int huurovereenkomstId)
	{
		this.huurovereenkomstId = huurovereenkomstId;
	}
	
}
